﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Data.SqlClient;
using System.Drawing;

namespace AccesoBD
{
    public class Medicos
    {
        public long registrarMedico(Medico med)
        {
            long nuevoLegajo = -1;
            SqlConnection conexion = DB.Conectar();
            SqlTransaction trans = null;
            try
            {
                trans = conexion.BeginTransaction();

                //cargamos los datos personales
                string comando = "INSERT INTO Persona(apellido, nombre, tipoDocumento, nroDocumento, telefono, celular, mail, sexo, fechaNacimiento) VALUES (@apellido,@nombre,@codTipoDoc,@nroDocumento,@telefono,@celular,@mail,@sexo,@fechaNacimiento)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@apellido", med.Apellido));
                sqlcmd.Parameters.Add(new SqlParameter("@nombre", med.Nombre));
                sqlcmd.Parameters.Add(new SqlParameter("@codTipoDoc", med.CodTipoDoc));
                sqlcmd.Parameters.Add(new SqlParameter("@nroDocumento", med.NroDocumento));
                if (med.Telefono == null)
                    sqlcmd.Parameters.Add(new SqlParameter("@telefono", DBNull.Value));
                else
                    sqlcmd.Parameters.Add(new SqlParameter("@telefono", med.Telefono));
                sqlcmd.Parameters.Add(new SqlParameter("@celular", med.Celular));
                if (med.Mail == null)
                    sqlcmd.Parameters.Add(new SqlParameter("@mail", DBNull.Value));
                else
                    sqlcmd.Parameters.Add(new SqlParameter("@mail", med.Mail));
                sqlcmd.Parameters.Add(new SqlParameter("@sexo", med.CodSexo));
                sqlcmd.Parameters.Add(new SqlParameter("@fechaNacimiento", med.FechaNacimiento));
                sqlcmd.Transaction = trans;
                sqlcmd.ExecuteNonQuery();

                SqlCommand sqlcmdID = new SqlCommand("SELECT @@identity FROM Persona", conexion);
                sqlcmdID.Transaction = trans;
                int idPersona = Convert.ToInt32(sqlcmdID.ExecuteScalar());
                med.codPersona = idPersona;

                //insertamos Medico
                //le seteamos la Persona, pero NO el Usuario.
                comando = "INSERT INTO Medico(nroMatricula, cuil, fechaAlta, codPersona) VALUES(@nroMatricula,@cuil,@fechaAlta,@codPersona)";
                sqlcmd = null;
                sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@nroMatricula", med.NroMatricula));
                sqlcmd.Parameters.Add(new SqlParameter("@cuil", med.CUIL));
                sqlcmd.Parameters.Add(new SqlParameter("@fechaAlta", med.FechaAlta));
                sqlcmd.Parameters.Add(new SqlParameter("@codPersona", med.codPersona));
                sqlcmd.Transaction = trans;
                int resMed = sqlcmd.ExecuteNonQuery();


                if (resMed > 0)
                {
                    string cmdNvoLegajo = "SELECT @@identity FROM Medico";
                    SqlCommand sqlcmdLegajo = new SqlCommand(cmdNvoLegajo, conexion);
                    sqlcmdLegajo.Transaction = trans;
                    nuevoLegajo = long.Parse(sqlcmdLegajo.ExecuteScalar().ToString());

                    trans.Commit();
                }

            }
            catch (Exception)
            {
                trans.Rollback();
                throw;
            }
            finally
            {
                conexion.Close();
            }
            return nuevoLegajo;
        }

        //OBTENER MEDICO POR IDUSR
        public static Medico obtenerMedicoPorUsuario(long idUsuario)
        {
            Medico m = null;
            SqlConnection con = null;
            try
            {
                con = DB.Conectar();
                List<SqlParameter> Listp = new List<SqlParameter>();
                string comando = "Select P.*,M.*, TD.nombre as nombreTD, S.nombre as nombreSex  from Medico M, Persona P, Tipo_Documento TD, Sexo  S where M.idUsuario=@idUsuario and P.codPersona=M.codPersona and P.tipoDocumento=TD.codTipoDoc and P.Sexo=S.codSexo";
                Listp.Add(new SqlParameter("@idUsuario", idUsuario));
                SqlDataReader dr = DB.GenerarReader(comando, Listp, con);


                if (dr.Read())
                {

                    m = new Medico();

                    m.Nombre = dr["nombre"].ToString();
                    m.Apellido = dr["apellido"].ToString();
                    m.ApellidoNombre = dr["apellido"].ToString() + ", " + dr["nombre"].ToString();
                    m.Legajo = (long)dr["legajo"];
                    m.NroMatricula = (long)dr["nroMatricula"];
                    m.NroDocumento = (long)dr["nroDocumento"];
                    m.CUIL = (long)dr["cuil"];
                    m.FechaAlta = Convert.ToDateTime(dr["fechaAlta"]);
                    m.TipoDocumento = new TipoDocumento();
                    m.TipoDocumento.Nombre = dr["nombreTD"].ToString();
                    m.Sexo = new Sexo();
                    m.Sexo.Nombre = dr["nombreSex"].ToString();
                    m.FechaNacimiento = DateTime.Parse(dr["fechaNacimiento"].ToString());
                    if (dr["fechaBaja"] != DBNull.Value)
                    {
                        m.FechaBaja = Convert.ToDateTime(dr["fechaBaja"]);
                    }
                    
                    if (dr["celular"] != DBNull.Value)
                    {
                        m.Celular = long.Parse(dr["celular"].ToString());
                    }
                    if (dr["telefono"] != DBNull.Value)
                    {
                        m.Telefono = long.Parse(dr["telefono"].ToString());
                    }
                    if (dr["mail"] != DBNull.Value)
                    {
                        m.Mail = dr["mail"].ToString();
                    }
                    if (dr["foto"]!=DBNull.Value)
                    {
                        byte[] imageBuffer = (byte[])(dr["foto"]);
                        System.IO.MemoryStream ms = new System.IO.MemoryStream(imageBuffer);
                        m.foto = Image.FromStream(ms);
                    }

                }
            }
            catch (Exception ex)
            {
                throw;
            }
            finally
            {
                con.Close();
            }
            return m;

        }//FIN METODO

        public static Medico ObtenerMedicoPorLegajo(long NroLegajo)
        {
            Medico m = null;
            SqlConnection con = null;
            try
            {
                con = DB.Conectar();
                List<SqlParameter> Listp = new List<SqlParameter>();
                string comando = "Select *  from Medico where legajo=@NroLegajo";
                Listp.Add(new SqlParameter("@NroLegajo", NroLegajo));
                SqlDataReader dr = DB.GenerarReader(comando, Listp, con);

                comando = "Select nombre, apellido From Persona where codPersona=@M_codPersona ";
                if (dr != null)
                {
                    Listp.Clear();
                    m.codPersona = (long)dr["codPersona"];
                    Listp.Add(new SqlParameter("@M_codPersona", m.codPersona));
                    SqlDataReader dr2 = DB.GenerarReader(comando, Listp, con);
                    m = new Medico();
                    if (dr2 != null)
                    {
                        m.Nombre = dr2["nombre"].ToString();
                        m.Apellido = dr2["apellido"].ToString();
                        m.Legajo = (int)dr["legajo"];
                        m.NroMatricula = (long)dr["nroMatricula"];
                        m.CUIL = (long)dr["cuil"];
                        m.FechaAlta = Convert.ToDateTime(dr["fechaAlta"]);
                        if (dr["fechaBaja"] != DBNull.Value)
                        {
                            m.FechaBaja = Convert.ToDateTime(dr["fechaBaja"]);
                        }
                        if (dr["usuario"] != DBNull.Value)
                        {
                            m.CodUsuario = (int)dr["usuario"];
                        }

                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("No se pudo cargar el medico", ex);
            }
            finally
            {
                con.Close();
            }
            return m;
        }

        //obtiene solo los nombres y legajos de los medicos
        public static List<Medico> obtenerTodosMedicosNombres()
        {
            List<Medico> listMed = null;
            Medico objMed = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Medico.legajo, Medico.nroMatricula, Medico.fechaBaja, Persona.nombre, Persona.apellido,Persona.nroDocumento, Sexo.nombre AS sexo "
                        + "FROM Medico INNER JOIN Persona ON Medico.codPersona = Persona.codPersona INNER JOIN "
                        + "Sexo ON Persona.sexo = Sexo.codSexo WHERE (Medico.fechaBaja IS NULL)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                SqlDataReader dr = sqlcmd.ExecuteReader();

                listMed = new List<Medico>();
                while (dr.Read())
                {
                    objMed = new Medico();
                    objMed.Legajo = int.Parse(dr["legajo"].ToString());
                    objMed.NroMatricula = int.Parse(dr["nroMatricula"].ToString());
                    objMed.Sexo = new Sexo();
                    objMed.Sexo.Nombre = dr["sexo"].ToString();
                    objMed.NroDocumento = (long)dr["nroDocumento"];
                    objMed.ApellidoNombre = dr["apellido"].ToString() + ", " + dr["nombre"].ToString();
                    //objMed.Nombre = dr["nombre"].ToString();
                    //objMed.Apellido = dr["apellido"].ToString();

                    listMed.Add(objMed);
                    objMed = null;
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return listMed;
        }

        //obtiene solo los nombres y legajos de los medicos, pero solo los que pertenecen a la especialidad pasada por parametro
        public static List<Medico> obtenerTodosMedicosNombres(int codEsp)
        {
            List<Medico> listMed = null;
            Medico objMed = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Medico.legajo, Persona.nombre, Persona.apellido, Persona.sexo, Medico.fechaBaja, Medico.nroMatricula, Sexo.nombre AS sexo "
                            + "FROM Medico INNER JOIN MedicoXEspecialidad ON Medico.legajo = MedicoXEspecialidad.legajo INNER JOIN "
                            + "Persona ON Medico.codPersona = Persona.codPersona INNER JOIN Sexo ON Persona.sexo = Sexo.codSexo "
                            + "WHERE (MedicoXEspecialidad.codEspecialidad = @codEsp) AND (Medico.fechaBaja IS NULL)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@codEsp", codEsp));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                listMed = new List<Medico>();
                while (dr.Read())
                {
                    objMed = new Medico();
                    objMed.Legajo = int.Parse(dr["legajo"].ToString());
                    objMed.NroMatricula = int.Parse(dr["nroMatricula"].ToString());
                    objMed.Sexo = new Sexo();
                    objMed.Sexo.Nombre = dr["sexo"].ToString();
                    objMed.ApellidoNombre = dr["apellido"].ToString() + ", " + dr["nombre"].ToString();
                    //objMed.Nombre = dr["nombre"].ToString();
                    //objMed.Apellido = dr["apellido"].ToString();

                    listMed.Add(objMed);
                    objMed = null;
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return listMed;
        }

        //obtiene los nombres y legajos de los medicos que atienden en especialidades vigentes por turnos
        public static List<Medico> obtenerMedicosPorTurnosNombres()
        {
            List<Medico> listaMedicos = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT MedicoXEspecialidad.legajo, Persona.nombre, Persona.apellido, MedicoXEspecialidad.codEspecialidad "
                                + "FROM MedicoXEspecialidad INNER JOIN Medico ON MedicoXEspecialidad.legajo = Medico.legajo INNER JOIN "
                                + "Persona ON Medico.codPersona = Persona.codPersona INNER JOIN Especialidad ON MedicoXEspecialidad.codEspecialidad = Especialidad.codEspecialidad "
                                + "INNER JOIN Modalidad_Atencion ON Especialidad.modalidad = Modalidad_Atencion.codModalidad INNER JOIN "
                                + "Tipo_Modalidad ON Modalidad_Atencion.idTipoModalidad = Tipo_Modalidad.codTipoModalidad "
                                + "WHERE (MedicoXEspecialidad.fechaBaja IS NULL OR MedicoXEspecialidad.fechaBaja > GETDATE()) AND (Tipo_Modalidad.codTipoModalidad = 1)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    listaMedicos = new List<Medico>();
                    Medico objMed = null;
                    while (dr.Read())
                    {
                        objMed = new Medico();
                        objMed.Legajo = long.Parse(dr["legajo"].ToString());
                        objMed.ApellidoNombre = dr["apellido"].ToString() + ", " + dr["nombre"].ToString();

                        listaMedicos.Add(objMed);
                        objMed = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return listaMedicos;
        }

        //obtiene los nombres y legajos de los medicos que atienden en especialidades vigentes por orden de llegada
        public static List<Medico> obtenerMedicosOrdenLlegadaNombres()
        {
            List<Medico> listaMedicos = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT MedicoXEspecialidad.legajo, Persona.nombre, Persona.apellido, MedicoXEspecialidad.codEspecialidad "
                                + "FROM MedicoXEspecialidad INNER JOIN Medico ON MedicoXEspecialidad.legajo = Medico.legajo INNER JOIN "
                                + "Persona ON Medico.codPersona = Persona.codPersona INNER JOIN Especialidad ON MedicoXEspecialidad.codEspecialidad = Especialidad.codEspecialidad "
                                + "INNER JOIN Modalidad_Atencion ON Especialidad.modalidad = Modalidad_Atencion.codModalidad INNER JOIN "
                                + "Tipo_Modalidad ON Modalidad_Atencion.idTipoModalidad = Tipo_Modalidad.codTipoModalidad "
                                + "WHERE (MedicoXEspecialidad.fechaBaja IS NULL OR MedicoXEspecialidad.fechaBaja > GETDATE()) AND (Tipo_Modalidad.codTipoModalidad = 2)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    listaMedicos = new List<Medico>();
                    Medico objMed = null;
                    while (dr.Read())
                    {
                        objMed = new Medico();
                        objMed.Legajo = long.Parse(dr["legajo"].ToString());
                        objMed.ApellidoNombre = dr["apellido"].ToString() + ", " + dr["nombre"].ToString();

                        listaMedicos.Add(objMed);
                        objMed = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return listaMedicos;
        }

        //devuelve un string con el nombre del medico buscado, en forma <nombre> <apellido>
        public static string obtenerNombreMedico(long legajo)
        {
            string nombre = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Medico.legajo, Persona.nombre, Persona.apellido FROM Medico INNER JOIN "
                      + "Persona ON Medico.codPersona = Persona.codPersona WHERE (Medico.legajo = @legajo)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                while (dr.Read())
                {
                    nombre = dr["nombre"].ToString() + " ";
                    nombre += dr["apellido"].ToString() + " - Legajo:";
                    nombre += dr["legajo"].ToString();
                }

            }
            catch (Exception)
            {

                throw;
            }
            return nombre;
        }

        public static List<EspecialidadMedico> obtenerEspecialidadesVigentesMedico(long legajo)
        {
            List<EspecialidadMedico> listEspMed = null;
            EspecialidadMedico objEspMed = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Especialidad.nombre, MedicoXEspecialidad.codEspecialidad, MedicoXEspecialidad.legajo, MedicoXEspecialidad.nroMatriculaEspecialidad, "
                      + "MedicoXEspecialidad.tieneHorario FROM Especialidad INNER JOIN MedicoXEspecialidad "
                      + "ON Especialidad.codEspecialidad = MedicoXEspecialidad.codEspecialidad "
                      + "WHERE (MedicoXEspecialidad.fechaBaja IS NULL) AND (MedicoXEspecialidad.legajo = @legajo)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                listEspMed = new List<EspecialidadMedico>();
                while (dr.Read())
                {
                    objEspMed = new EspecialidadMedico();
                    objEspMed.LegajoMedico = int.Parse(dr["legajo"].ToString());
                    objEspMed.NumeroMatriculaEspecialidad = int.Parse(dr["nroMatriculaEspecialidad"].ToString());
                    objEspMed.CodEspecialidad = int.Parse(dr["codEspecialidad"].ToString());
                    objEspMed.NombreEspecialidad = dr["nombre"].ToString();
                    objEspMed.Especialidad = new Especialidad();
                    objEspMed.Especialidad.Nombre = dr["nombre"].ToString();
                    objEspMed.TieneHorario = bool.Parse(dr["tieneHorario"].ToString());

                    listEspMed.Add(objEspMed);
                    objEspMed = null;
                }

            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                conexion.Close();
            }
            return listEspMed;
        }

        //devuelve una lista con todas las especialidades del medico, incluidas las dadas de baja
        //de acuerdo al legajo que se paso por parametro.
        public static List<EspecialidadMedico> obtenerTodasEspecialidadesMedico(long legajo)
        {
            List<EspecialidadMedico> listTodasEspMed = null;
            Especialidad esp = null;
            EspecialidadMedico espMed = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Especialidad.nombre, MedicoXEspecialidad.codEspecialidad, MedicoXEspecialidad.fechaBaja, MedicoXEspecialidad.fechaAlta "
                            + "FROM Especialidad INNER JOIN MedicoXEspecialidad ON Especialidad.codEspecialidad = MedicoXEspecialidad.codEspecialidad "
                            + "WHERE (MedicoXEspecialidad.legajo = @legajo) AND (Especialidad.fechaBaja IS NULL)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                listTodasEspMed = new List<EspecialidadMedico>();
                while (dr.Read())
                {
                    esp = new Especialidad();
                    esp.CodEspecialidad = int.Parse(dr["codEspecialidad"].ToString());
                    esp.Nombre = dr["nombre"].ToString();

                    espMed = new EspecialidadMedico();
                    espMed.CodEspecialidad = int.Parse(dr["codEspecialidad"].ToString());
                    espMed.LegajoMedico = legajo;
                    espMed.Especialidad = esp;
                    espMed.FechaAlta = DateTime.Parse(dr["fechaAlta"].ToString());
                    if (dr["fechaBaja"] == DBNull.Value)
                        espMed.FechaBaja = null;
                    else
                        espMed.FechaBaja = DateTime.Parse(dr["fechaBaja"].ToString());

                    listTodasEspMed.Add(espMed);
                    espMed = null;
                    esp = null;
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return listTodasEspMed;
        }

        public static bool registrarEspecialidadAMedico(long legajoMed, long nroMatEsp, int codEsp, DateTime fechaAlta)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "INSERT INTO MedicoXEspecialidad (codEspecialidad, fechaAlta, nroMatriculaEspecialidad, legajo, tieneHorario) "
                            + "VALUES (@codEsp,@fechaAlta,@nroMatEsp,@legajo,@tieneHorario)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@codEsp", codEsp));
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", legajoMed));
                sqlcmd.Parameters.Add(new SqlParameter("@fechaAlta", fechaAlta));
                sqlcmd.Parameters.Add(new SqlParameter("@nroMatEsp", nroMatEsp));
                sqlcmd.Parameters.Add(new SqlParameter("@tieneHorario", false));
                int filas = sqlcmd.ExecuteNonQuery();

                if (filas > 0)
                    res = true;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }

        //actualiza el campo "TieneHorario" de la especialidad del medico pasada por parametro
        public static bool actualizarCantHorariosEspecialidadMedico(EspecialidadMedico espMedActualizada)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "UPDATE MedicoXEspecialidad SET tieneHorario = @tieneHorario WHERE (legajo = @legajo) AND (codEspecialidad = @codEsp)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@tieneHorario", espMedActualizada.TieneHorario));
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", espMedActualizada.LegajoMedico));
                sqlcmd.Parameters.Add(new SqlParameter("@codEsp", espMedActualizada.CodEspecialidad));
                int filas = sqlcmd.ExecuteNonQuery();

                if (filas > 0)
                    res = true;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }

        //me retorna la ultima fecha de turno generado para esa especialidad en ese medico, null en caso de que nunca se haya hecho la agenda.
        public static DateTime? obtenerFechaUltimoTurno(EspecialidadMedico espMed)
        {
            DateTime? fechaUltimoTurno = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT legajo, codEspecialidad, fechaBaja, tieneHorario, fechaUltimoTurno FROM MedicoXEspecialidad "
                             + "WHERE (tieneHorario = 1) AND (fechaBaja IS NULL OR fechaBaja > GETDATE()) AND (legajo = @legajo) AND (codEspecialidad = @codEsp)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", espMed.LegajoMedico));
                sqlcmd.Parameters.Add(new SqlParameter("@codEsp", espMed.CodEspecialidad));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                while (dr.Read())
                {
                    if (dr["fechaUltimoTurno"] != DBNull.Value)
                        fechaUltimoTurno = DateTime.Parse(dr["fechaUltimoTurno"].ToString());
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return fechaUltimoTurno;
        }

        public static bool modificarMatriculaEspecialidadMedico(EspecialidadMedico espMedModificada)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "UPDATE MedicoXEspecialidad SET nroMatriculaEspecialidad = @matriculaNueva WHERE (legajo = @legajo) AND (codEspecialidad = @codEsp)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", espMedModificada.LegajoMedico));
                sqlcmd.Parameters.Add(new SqlParameter("@codEsp", espMedModificada.CodEspecialidad));
                sqlcmd.Parameters.Add(new SqlParameter("@matriculaNueva", espMedModificada.NumeroMatriculaEspecialidad));
                int filas = sqlcmd.ExecuteNonQuery();

                if (filas > 0)
                    res = true;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }

        public static bool eliminarEspecialidadMedico(EspecialidadMedico espMed, DateTime fechaBaja, out DateTime? fechaUltimoTurno)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            try
            {
                //1° debemos validar si tiene turnos otorgados, si los tiene, NO podemos darle de baja a la especialidad
                string comando = "SELECT legajo, codEspecialidad, fechaUltimoTurno FROM MedicoXEspecialidad WHERE (legajo = @legajo) AND (codEspecialidad = @codEsp) AND (fechaBaja IS NULL OR fechaBaja > GETDATE())";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", espMed.LegajoMedico));
                sqlcmd.Parameters.Add(new SqlParameter("@codEsp", espMed.CodEspecialidad));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr["fechaUltimoTurno"] == DBNull.Value)
                    fechaUltimoTurno = null;
                else
                    fechaUltimoTurno = DateTime.Parse(dr["fechaUltimoTurno"].ToString());

                if (fechaUltimoTurno == null)
                {
                    comando = "UPDATE MedicoXEspecialidad SET fechaBaja = @fechaBaja WHERE (legajo = @legajo) AND (codEspecialidad = @codEsp) AND (fechaBaja IS NULL OR fechaBaja > GETDATE())";
                    sqlcmd = new SqlCommand(comando, conexion);
                    sqlcmd.Parameters.Add(new SqlParameter("@legajo", espMed.LegajoMedico));
                    sqlcmd.Parameters.Add(new SqlParameter("@codEsp", espMed.CodEspecialidad));
                    sqlcmd.Parameters.Add(new SqlParameter("@fechaBaja", fechaBaja));
                    int filas = sqlcmd.ExecuteNonQuery();

                    if (filas > 0)
                        res = true;
                }



            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }

        //OBTENER MEDICO VIA WEB
        public static Medico obtenerMedicoPorLegajoWEB(long nroLega)
        {
            Medico m = null;
            SqlConnection con = null;
            try
            {
                con = DB.Conectar();
                List<SqlParameter> Listp = new List<SqlParameter>();
                string comando = "Select P.*,M.*, TD.nombre as nombreTD, S.nombre as nombreSex  from Medico M, Persona P, Tipo_Documento TD, Sexo  S where M.legajo=@lega and P.codPersona=M.codPersona and P.tipoDocumento=TD.codTipoDoc and P.Sexo=S.codSexo";
                Listp.Add(new SqlParameter("@lega", nroLega));
                SqlDataReader dr = DB.GenerarReader(comando, Listp, con);


                if (dr.Read())
                {

                    m = new Medico();

                    m.Nombre = dr["nombre"].ToString();
                    m.Apellido = dr["apellido"].ToString();
                    m.ApellidoNombre = dr["apellido"].ToString() + ", " + dr["nombre"].ToString();
                    m.Legajo = (long)dr["legajo"];
                    m.NroMatricula = (long)dr["nroMatricula"];
                    m.NroDocumento = (long)dr["nroDocumento"];
                    m.CUIL = (long)dr["cuil"];
                    m.FechaAlta = Convert.ToDateTime(dr["fechaAlta"]);
                    m.TipoDocumento = new TipoDocumento();
                    m.TipoDocumento.Nombre = dr["nombreTD"].ToString();
                    m.Sexo = new Sexo();
                    m.Sexo.Nombre = dr["nombreSex"].ToString();
                    m.FechaNacimiento = DateTime.Parse(dr["fechaNacimiento"].ToString());
                    if (dr["fechaBaja"] != DBNull.Value)
                    {
                        m.FechaBaja = Convert.ToDateTime(dr["fechaBaja"]);
                    }

                    if (dr["celular"] != DBNull.Value)
                    {
                        m.Celular = long.Parse(dr["celular"].ToString());
                    }
                    if (dr["telefono"] != DBNull.Value)
                    {
                        m.Telefono = long.Parse(dr["telefono"].ToString());
                    }
                    if (dr["mail"] != DBNull.Value)
                    {
                        m.Mail = dr["mail"].ToString();
                    }
                    if (dr["foto"] != DBNull.Value)
                    {
                        byte[] imageBuffer = (byte[])(dr["foto"]);
                        System.IO.MemoryStream ms = new System.IO.MemoryStream(imageBuffer);
                        m.foto = Image.FromStream(ms);
                    }


                }
            }
            catch (Exception ex)
            {
                throw;
            }
            finally
            {
                con.Close();
            }
            return m;

        }//FIN METODO
        
        public static List<EspecialidadWeb> obtnerEspecialidadesPorHorarioWEB(long nroHC)
        {
            List<EspecialidadWeb> lstE = new List<EspecialidadWeb>();
            EspecialidadWeb oEW = null;
            SqlConnection con = DB.Conectar();
            try
            {
                string comando = "SELECT     HorarioAtencionXMedicoXEspecialidad.horaHasta, HorarioAtencionXMedicoXEspecialidad.horaDesde, HorarioAtencionXMedicoXEspecialidad.diaSemana, "
                      + "HorarioAtencionXMedicoXEspecialidad.idConsultorio, Especialidad.nombre as NombreEsp, HorarioAtencionXMedicoXEspecialidad.legajo, "
                      + "HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta "
                      + "FROM HorarioAtencionXMedicoXEspecialidad INNER JOIN "
                      + "Especialidad ON HorarioAtencionXMedicoXEspecialidad.codEspecialidad = Especialidad.codEspecialidad "
                      + "WHERE     (HorarioAtencionXMedicoXEspecialidad.legajo = @lega) and Especialidad.fechaBaja is Null";
                List<SqlParameter> lstp = new List<SqlParameter>();
                lstp.Add(new SqlParameter("@lega", nroHC));
                SqlDataReader dr = DB.GenerarReader(comando, lstp, con);
                while (dr.Read())
                {
                    oEW = new EspecialidadWeb();
                    oEW.horaDesde = (TimeSpan)dr["horaDesde"];
                    oEW.horaHasta = (TimeSpan)dr["horaHasta"];
                    int d = (int)dr["diaSemana"];
                    switch (d)
                    {
                        case 1:
                            break;
                        case 2:
                            oEW.dia = "Lunes";
                            break;
                        case 3:
                            oEW.dia = "Martes";
                            break;
                        case 4:
                            oEW.dia = "Miercoles";
                            break;
                        case 5:
                            oEW.dia = "Jueves";
                            break;
                        case 6:
                            oEW.dia = "Viernes";
                            break;
                        case 7:
                            oEW.dia = "Sabado";
                            break;
                    }
                    oEW.Especialidad = dr["NombreEsp"].ToString();
                    oEW.consultorio = (int)dr["idConsultorio"];
                    lstE.Add(oEW);
                    oEW = null;

                }

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                con.Close();

            }

            return lstE;
        }

        //metodo Barby - usado en pago a medico
        public static List<EspecialidadMedico> obtenerMedicosDiaDeHoy()
        {
            List<EspecialidadMedico> list= null;

            int nroDiaSemana = 0;
            //obtenemos el dia de la semana de la fecha de hoy
            switch (DateTime.Now.DayOfWeek)
            {
                case DayOfWeek.Friday:
                    nroDiaSemana = 6;
                    break;
                case DayOfWeek.Monday:
                    nroDiaSemana = 2;
                    break;
                case DayOfWeek.Saturday:
                    nroDiaSemana = 7;
                    break;
                case DayOfWeek.Sunday:
                    nroDiaSemana = 1;
                    break;
                case DayOfWeek.Thursday:
                    nroDiaSemana = 5;
                    break;
                case DayOfWeek.Tuesday:
                    nroDiaSemana = 3;
                    break;
                case DayOfWeek.Wednesday:
                    nroDiaSemana = 4;
                    break;
            }

            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Persona.nombre, Persona.apellido, Persona.nroDocumento, Especialidad.nombre AS nombreEspecialidad, MedicoXEspecialidad.legajo, MedicoXEspecialidad.codEspecialidad, "
                               + "Medico.nroMatricula, HorarioAtencionXMedicoXEspecialidad.diaSemana, Modalidad_Atencion.idTipoModalidad "
                               + "FROM MedicoXEspecialidad INNER JOIN Medico ON MedicoXEspecialidad.legajo = Medico.legajo INNER JOIN "
                               + "Persona ON Medico.codPersona = Persona.codPersona INNER JOIN Especialidad ON MedicoXEspecialidad.codEspecialidad = Especialidad.codEspecialidad INNER JOIN "
                               + "HorarioAtencionXMedicoXEspecialidad ON MedicoXEspecialidad.legajo = HorarioAtencionXMedicoXEspecialidad.legajo AND "
                               + "MedicoXEspecialidad.codEspecialidad = HorarioAtencionXMedicoXEspecialidad.codEspecialidad INNER JOIN "
                               + "Modalidad_Atencion ON Especialidad.modalidad = Modalidad_Atencion.codModalidad "
                               + "WHERE (HorarioAtencionXMedicoXEspecialidad.diaSemana = @diaSemana)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@diaSemana", nroDiaSemana));
                SqlDataReader dr = sqlcmd.ExecuteReader();
                if (dr.HasRows)
                {
                    list = new List<EspecialidadMedico>();
                    EspecialidadMedico espmed = null;
                    while (dr.Read())
                    {
                        espmed = new EspecialidadMedico();
                        espmed.ApellidoNombreMedico = dr["apellido"].ToString() + ", " + dr["nombre"].ToString();
                        espmed.CodEspecialidad = int.Parse(dr["codEspecialidad"].ToString());
                        espmed.NombreEspecialidad = dr["nombreEspecialidad"].ToString();
                        espmed.NumeroMatriculaEspecialidad = long.Parse(dr["nroMatricula"].ToString());
                        espmed.LegajoMedico = long.Parse(dr["legajo"].ToString());
                        espmed.IdTipoModalidadAtencion = int.Parse(dr["idTipoModalidad"].ToString()); //tomamos el tipo de atencion de esa especialidad
                        Medico med = new Medico();
                        med.NroMatricula = long.Parse(dr["legajo"].ToString());
                        med.Nombre = dr["nombre"].ToString();
                        med.Apellido = dr["apellido"].ToString();
                        med.NroDocumento = long.Parse(dr["nroDocumento"].ToString());
                        espmed.Medico = med;

                        list.Add(espmed);
                        espmed = null;
                    }
                }
            }
            catch (Exception ex)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }

        public bool nroDocExistente(int tipoDoc, long nroDoc)
        {
            bool res = false;
            SqlConnection con = DB.Conectar();

            try
            {
                string comando = "SELECT * FROM Persona WHERE tipoDocumento=@tipoDoc AND nroDocumento=@nroDoc";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@nroDoc", nroDoc));
                listp.Add(new SqlParameter("@tipoDoc", tipoDoc));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                if (dr.Read())
                {
                    res = true;
                }
            }
            catch (Exception Ex)
            {

                throw new Exception("Error al registrar el empleado: " + Ex.Message);
            }
            finally
            {
                con.Close();

            }
            return res;

        }

        public long ObtenerUltimoLegajoMedico()
        {
            SqlConnection con = DB.Conectar();
            long id = 0;
            SqlTransaction tran = null;
            try
            {

                tran = con.BeginTransaction();

                string comando = "select Max(legajo) from Medico";
                List<SqlParameter> listp = new List<SqlParameter>();
                string legajo = DB.EjecutarScalar(comando, listp, con, tran);
                if (!legajo.Equals(""))
                {//Tener en cuenta si retorna siempre null. Siempre retornaria cero
                    id = long.Parse(legajo.ToString());

                }
                tran.Commit();

            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw new Exception("Error al obtener ultimo Id del Paciente", Ex);
            }
            finally
            {
                con.Close();

            }

            return id;
        }

    }
}
